<?php
// ------------------------------------------------------------------------
// |@Author       : Jarmin <edshop@qq.com>
// |@----------------------------------------------------------------------
// |@Date         : 2023-06-24 19:09:40
// |@----------------------------------------------------------------------
// |@LastEditTime : 2023-06-24 19:32:19
// |@----------------------------------------------------------------------
// |@LastEditors  : Jarmin <jarmin@ladmin.cn>
// |@----------------------------------------------------------------------
// |@Description  : 
// |@----------------------------------------------------------------------
// |@FilePath     : Dept.php
// |@----------------------------------------------------------------------
// |@Copyright (c) 2023 http://www.ladmin.cn   All rights reserved. 
// ------------------------------------------------------------------------
namespace app\setting\logic;

use think\admin\Logic;

/**
 * 部门逻辑类，用于实现部门相关的业务逻辑操作。
 */
class Dept extends Logic
{
    /**
     * 根据条件查询部门列表。
     * 如果 $data 中包含 name 字段，则返回名称包含指定字符串的部门列表；
     * 否则返回全部部门列表。部门列表按 sort 字段递增排序。
     * @param array $data 查询条件。可以包含 name 字段，表示查询名称包含指定字符串的部门列表。
     * @return array 部门列表数组。
     */
    public function getList(array $data): array
    {
        // 根据查询条件 $data 组装 SQL 的 WHERE 子句
        $where = !empty($data['name']) ? [["name", "like", "%" . $data['name'] . "%"]] : [["id", ">", 0]];
        // 查询数据库，获取符合条件的所有部门记录
        $depts = $this->modelSystemDept->getListByWhere($where, ['sort' => 'asc']);
        // 返回查询结果和执行状态信息
        return $this->json(SUCCESS, lang('dept.get_dept_list_success'), $depts->toArray());
    }

    /**
     * 保存部门信息。如果 $data 中包含 id，则执行更新操作；否则执行添加操作。
     * @param array $data 部门信息。必须包含 name、sort、status 等字段。
     * @return JsonResponse
     */
    public function saveDept(array $data)
    {
        return $this->tryCatch(function() use ($data){
            if (!empty($data['id'])) {
                // 如果传入的 $data 中有 id ，则执行更新操作
                $this->modelSystemDept->updateById($data['id'], $data);
                // 编辑成功，写入日志
                // $this->serviceSystem->setLog(SUCCESS, 'info', lang('log.dept_edit'), lang('log.edit_dept_info',['name'=>$data['name']]));
            } else {
                // 否则执行添加操作
                $data['id'] = $this->modelSystemDept->add($data);
                // 创建成功，写入日志
                // $this->serviceSystem->setLog(SUCCESS, 'info', lang('log.dept_add'), lang('log.add_dept_info',['name'=>$data['name']]));
            }
            // 返回保存结果和部门信息
            return $this->json(SUCCESS, lang('dept.save_dept_info_success'), $data);
        });
    }

    /**
     * 以事务方式删除多个部门及其所有子孙部门。
     * @param array $data 待删除部门ID列表
     * @return JsonResponse
     * @throws \think\db\exception\PDOException
     * @throws \Throwable
     */
    public function deleteDept(array $data)
    {
        return $this->tryCatch(function() use ($data) {
            // 找到所有待删除的节点和它们的所有子节点。
            $toDelete = $this->modelSystemDept->whereIn('id', $data['ids'])->select();
            $toDeleteIds = array_column($toDelete->toArray(), 'id');
            foreach ($toDelete->toArray() as $item) {
                $toDeleteIds = array_merge($toDeleteIds, $this->getDescendantIds($this->modelSystemDept, $item['id']));
            }
            // 删除所有待删除的节点和它们的所有子节点。
            $this->modelSystemDept->deleteById($toDeleteIds);
            // 获取所有包含指定部门 ID 的用户
            $users = $this->modelSystemUser->whereIn('dept_id', $toDeleteIds)->select();
            foreach ($users as $user) {
                $user->dept_id = 0;
                $user->save();
            }
            // 删除成功，写入日志
            // $this->serviceSystem->setLog(SUCCESS, 'info', lang('log.dept_delete'), lang('log.dept_delete_for', ['id' => implode(',', $toDeleteIds)]));
            // 返回删除成功的信息和状态
            return $this->json(SUCCESS, lang('dept.delete_dept_success'));
        });
    }
}